C++中的locale设置 (即系统区域设置)

您所在的位置:网站首页 locale 设置 C++中的locale设置 (即系统区域设置)

C++中的locale设置 (即系统区域设置)

2024-07-18 08:06:35| 来源: 网络整理| 查看: 265

C++中的locale设置

参考:

区域设置和代码页

C/C++程序中,locale(即系统区域设置,即国家或地区设置)将决定程序所使用的当前语言编码、日期格式、数字格式及其它与区域有关的设置,locale设置的正确与否将影响到程序中字符串处理(wchar_t如何输出、strftime()的格式等)。因此,对于每一个程序,都应该慎重处理locale设置。

C locale和C++ locale是独立的。C locale用setlocale(LC_CTYPE, “”)初始化, C++ locale用std::locale::global(std::locale(“”))初始化。这样就可以根据当前运行环境正确设置locale。

根据环境变量中设置编码信息

使用第二个参数为”"的setlocale()调用会自动根据LC_ALL、LC_CTYPE和LANG环境变量的值设置合适的值。

[cpp] view plaincopy #include   #include     using std::locale;    int main()  {      setlocale(LC_CTYPE, "");        // 使用当前locale,但numpunct使用缺省的,因此不会在输出数字时加上千位分隔符      locale::global(locale("").combine(locale::classic()));setlocale()的有效的locale串   setlocale()的有效的locale串

在windows下可以用”.codepage”如”.936″来指定,linux下可以指定得更详细:”zh_CN.GB18030″。zh(语言,这里指中文)_CN(地区,这里指中国大陆).GB18030(该语言所使用的字符集)。可能有一个以上的国家/地区说某种特定的语言,例如,巴西和葡萄牙都说葡萄牙语。反之,一个国家/地区可能有一种以上的官方语言。例如,加拿大有两种官方语言:英语和法语。语言和地区两个因素组合才会确定一个字符集,即使用某个语言的某一地区会创建一个该地区的字符集来表示该语言的字符。

windows下不能直接指定“GB18030”,可能只能用“GBK”。

检测当前的语言环境是否使用了 UTF-8 编码

先用setlocale()设置编码,再用nl_langinfo()进行检测

为检测当前语言环境是否使用了 UTF-8 编码。首先必须调用 setlocale(LC_CTYPE, “”) 函数,依据环境变量设置语言环境。nl_langinfo(CODESET) 函数也是由 locale charmap 命令调用,从而查找当前语言环境指定的编码名称。

[cpp] view plaincopy BOOL utf8_mode = FALSE;  if(!strcmp(nl_langinfo(CODESET), "UTF-8")       utf8_mode = TRUE;•直接查询环境变量     这项测试假设 UTF-8 语言环境名称中有值“UTF-8”,但实际情况并不总是如此,所以应该使用 nl_langinfo() 方法。      char *s;  BOOL utf8_mode = FALSE;  if ((s = getenv("LC_ALL")) || (s = getenv("LC_CTYPE")) || (s = getenv ("LANG")))    {      if (strstr(s, "UTF-8"))          utf8_mode = TRUE;    }  

附加:

区域设置(即locale)就成为语言、国家/地区和代码页的唯一组合。可以通过调用setlocale 函数在运行时更改区域设置和代码页设置。

参考:

locale C++  百度

=======================================

C++之国际化(2) --- locale 分类: C++ 2014-03-03 13:30 487人阅读 评论(0) 收藏 举报

转载自:http://hi.baidu.com/nicker2010/item/8cc13bce77f11b3899b498eb

 

解决国际化问题,通常是通过locale环境,它被用来封装国家(地域)和文化之间的转换行为。 一个locale就是一个参数和函数的集合。根据X/Open公约,环境变量LANG用来确定当时的locale 不同的浮点数、日期、货币格式等则根据这个locale确定。

确定一个locale,需要采用以下字符串格式: language[_area[.code]] language表示语言,例如英语或者德语 _area表示该语言所处的地域、国家或者文化。用它可以在相同语言的不同国家之间实行转换 code定义字符编码方案,其重要性主要体现在亚洲,因为在那相同的字符集有不同的编码方案,如汉字的BIG5和GB 下面列出了典型的语言名称:

c           Default: ANSI-C conventions (English, 7 bit) de_DE       German in Germany de_DE.      88591   German in Germany with ISO Latin-1 encoding de_AT       German in Austria de_CH       German in Switzerland en_US       English in the United States en_GB       English in Great Britain en_AU       English in Australia en_CA       English in Canada fr_FR       French in France fr_CH       French in Switzerland fr_CA       French in Canada ja_JP.jis   Japanese in Japan with Japanese Industrial Standard (JIT) encoding ja_JP.sjis  Japanese in Japan with Shift JIS encoding ja_JP.ujis  Japanese in Japan with UNIXized JIS encoding ja_JP.EUC   Japanese in Japan with Extended UNIX Code encoding ko_KR       Korean in Korea zh_CN       Chinese in China zh_TW       Chinese in Taiwan lt_LN.bit7  ISO Latin, 7 bit lt_LN.bit8  ISO Latin, 8 bit POSIX       POSIX conventions (English, 7 bit)

但它们尚未标准化。 对程序而言,这些名称是否标准化无关紧要, 因为locale的信息是由使用者根据以某种形式提供的。 普遍的做法是:程序只需读取环境变量或者类似的数据库,判断可用的locales, 然后便可以将“选择正确locale名称"的任务交给使用者。

C程序可以使用函数setlocale()来设定一个locale。 改变locale会对isupper()和toupper()之类的字符函数以及printf()之类的I/O函数产生影响 但C的解决方案有很多的限制。 C++的标准中,locale则被泛化,设计得更有弹性

locale使用示例: cin.imbue(locale::classic()); ///使用经典的C的locale从标准流中读取数据 cout.imbue(local("de_DE")); ///imbue函数用来安装locale,///德国的小数点为逗号(',') double value; while(cin>>value)     cout   public:     typedef int category;

    class facet;     class id;     class _Impl;

    friend class facet;     friend class _Impl;

    /**has_facet和use_facet是两个重要的友元函数

   has_facet确定locale中是否有类型为_Facet的facet

   use_facet返回locale中使用的类型为_Facet的facet对象的引用

*/

    template     friend bool has_facet(const locale&) throw();

    template     friend const _Facet& use_facet(const locale&);

    template friend struct __use_cache;

    /**locale中使用的facet*/

    static const category none  = 0;     static const category ctype  = 1L 12    cerr



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


    图片新闻

    实验室药品柜的特性有哪些
    实验室药品柜是实验室家具的重要组成部分之一,主要
    小学科学实验中有哪些教学
    计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
    实验室各种仪器原理动图讲
    1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
    高中化学常见仪器及实验装
    1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
    微生物操作主要设备和器具
    今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
    浅谈通风柜使用基本常识
     众所周知,通风柜功能中最主要的就是排气功能。在

    专题文章

      CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭